/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import br.ufpi.domain.Pergunta;
import br.ufpi.domain.Resposta;
import br.ufpi.domain.Usuario;
import java.util.Iterator;

/**
 * Sempre na hora de Decodifiar o Array Retornado que esta na posição 0
 * representa o nome protocolo
 * 
 * @author cleiton
 */
public class ProtocoloMensagem {

    /**
     * Codifica login do usuario
     * @param matricula
     * @param senha
     * @return string contendo login, matricula e senha codificados
     */
    public String codificarLoginUsuario(String matricula, String senha) {
        return "LOGIN" + "@," + matricula + "@," + senha;
    }

    /**
     * Codifica cadastro do usuario
     * @param matricula
     * @param senha
     * @param email
     * @param nome
     * @return string contendo matricula, nome, senha e email codificados
     */
    public String codificarCadastroUsuario(String matricula, String senha,
            String email, String nome) {
        return "CADA@," + matricula + "@," + nome + "@," + senha + "@," + email;
    }

    /**
     * Codifica alteração de senha
     * @param matricula
     * @param senhaNova
     * @param senhaAntiga
     * @return string codificada
     */
    public String codificarAlterarSenha(String matricula, String senhaNova,
            String senhaAntiga) {
        return "ALTERARSENHA@," + matricula + "@," + senhaAntiga + "@,"
                + senhaNova;
    }

    /**
     * Codifica mensagem de erro
     * @param erro
     * @return string codificada
     */
    public String codificarMensagemErro(String erro) {
        return "ERRO@," + erro;
    }

    /**
     * Codifica mensagem de login correto
     * @param sucesso
     * @param isadmin
     * @return string codificada
     */
    public String codificarMensageLogniSucesso(String sucesso, boolean isadmin) {
        return "SUCE@," + sucesso + "@," + isadmin;
    }

    /**
     * Remove usuario pelo id
     * @param id
     * @return string com id do usuario removido
     */
    public String removerUsuario(Long id) {
        return "REMOUSU,@" + id;
    }

    /**
     * Lista todos os usuarios cadastrados
     * @return
     */
    public String listarTodosUsuario() {
        return "LISTALLUSU";
    }

    /**
     * Lista todos os usuarios pendentes
     * @return
     */
    public String listarTodosUsuarioPendentes() {
        return "LISTUSUPEN";
    }

    /**
     * Decodifica qualquer mensagem sendo que a primeira string é o protocolo
     * @param codificada
     * @return vetor de string com mensagem decodificada
     */
    public String[] decodificar(String codificada) {
        String[] decodificar = codificada.split("@,");
        return decodificar;
    }

    /** Protocolo que serve para identificar qualquer coisa não especifica.
     * @param mensagem
     * @return
     */
    public String codificar(String mensagem) {
        return "SEM@," + mensagem;
    }

    /**Codifica pergunta, quando cliente pretende adicionar nova pergunta.
     * @param titulo
     * @param mensagem
     * @param matricula
     * @return string com dados da pergunta e matricula codificada
     */
    public String codificarEnviarPergunta(String titulo, String mensagem,
            String matricula) {
        return "ENVIARPERGUNTA@," + titulo + "@," + mensagem + "@," + matricula;
    }

    /**Decodifica pergunta, quando o Servidor recebe solicidação de adicionar nova pergunta.
     * @param mensagem
     * @return um tipo pergunta
     */
    public Pergunta decodificarEnvioPergunta(String mensagem) {
        String[] decodificar = mensagem.split("@,");
        Pergunta pergunta = new Pergunta();
        pergunta.setMensagem(decodificar[2]);
        pergunta.setTitulo(decodificar[1]);
        Usuario user = new Usuario();
        user.setId(Long.parseLong(decodificar[3]));
        pergunta.setUsuario(user);
        return pergunta;
    }

    /**
     * Remove pergunta correspondente ao id
     * @param id
     * @return
     */
    public String removerPergunta(Long id) {
        return "REMOPER,@" + id;
    }
    /**
     * Lista todas as perguntas
     * @return
     */
    public String listarTodasPerguntas() {
        return "LISTALLPER";
    }

    /**
     * Lista todas as perguntas do usuario correspondente ao id
     * @param id
     * @return
     */
    public String listarTodasPerguntasUsuario(Long id) {
        return "LISTUSUPER@," + id;
    }

    /**
     * Lista todas as perguntas pendentes
     * @return
     */
    public String listarTodosPerguntasPendentes() {
        return "LISTPERPEN";
    }

    /**
     * Remove resposta correspondente ao id
     * @param id
     * @return
     */
    public String removerResposta(Long id) {
        return "REMORES,@" + id;
    }

    /**
     * Lista todas as respostas
     * @return
     */
    public String listarTodasResposta() {
        return "LISTALLRES";
    }

    /**
     * Lista todas as respostas do usuario corresponde ao id
     * @param id
     * @return
     */
    public String listarTodasRespostaUsuario(Long id) {
        return "LISTALLRES@," + id;
    }

    /**
     * Lista todas as respostas pendentes
     * @return
     */
    public String listarTodasRespostasPendentes() {
        return "LISTRESPEN";
    }

    /**
     * Lista todas as respostas ligadas a pergunta corrente, que é identificada pelo idPergunta
     * @param idPergunta
     * @return
     */
    public String listarTodasRespostasPorPerguntas(Long idPergunta) {
        return "LISTRESPER@," + idPergunta;
    }
    /**
     *
     * @return
     */
    public String sucesso() {
        return "SUCE";
    }
    /**
     * Método get que retorna um usuario identificado pela matricula
     * @param matriculaUsuario
     * @return
     */
    public String getUsuario(String matriculaUsuario) {
        return "USUGET@," + matriculaUsuario;
    }
    /**
     * Codifica usuario
     * @param nomeCompleto
     * @param email
     * @return
     */
    public String codificarUsuario(String nomeCompleto, String email) {
        return "USUARIO@," + nomeCompleto + "@," + email;
    }
    /**
     *
     * @param string
     * @return
     */
    public String sucesso(String string) {
        return sucesso() + "@," + string;
    }

    /**Metodo para requisição de perguntas
     * @param matricula
     * @param numeroInicio
     * @param numeroPerguntas
     * @param isMinhaPerguntas True minhas Perguntas; False todas as Perguntas
     * @param respondidas
     * @param frequencia
     * @return mensagem codificada
     */
    public String getPerguntas(String matricula, int numeroInicio,
            int numeroPerguntas, boolean isMinhaPerguntas, String respondidas, String frequencia) {
        return "GETPERG" + "@," + matricula + "@,"
                + numeroInicio + "@,"
                + numeroPerguntas + "@,"
                + isMinhaPerguntas + "@,"
                + respondidas + "@,"
                + frequencia;
    }

    /**Codifica uma lista de Perguntas
     * @param perguntas lista de perguntas
     * @param totalPerguntas
     * @return string contendo pergunta codificada
     */
    public String codificarPerguntas(Collection<Pergunta> perguntas, int totalPerguntas) {
        StringBuilder builder = new StringBuilder();
        Long idMaior = (long) 0;
        builder.append("MINHASPERGUNTAS@,");
        if (perguntas != null && !perguntas.isEmpty()) {
            builder.append("PERGUNTAS:");
            builder.append("@,");
            for (Pergunta pergunta2 : perguntas) {
                builder.append(pergunta2.getTitulo());
                builder.append("@@");
                builder.append(pergunta2.getMensagem());
                builder.append("@@");
                builder.append(pergunta2.getStatus());
                builder.append("@@");
                builder.append(pergunta2.getId());
                builder.append("@@");
                builder.append(pergunta2.getUsuario().getNomeCompleto());
                builder.append("@@");
                builder.append("FINALPERGUNTA");
                if (idMaior < pergunta2.getId()) {
                    idMaior = pergunta2.getId();
                }

            }
            builder.append("@,");
            builder.append(idMaior);
            builder.append("@,");
            builder.append(totalPerguntas);
        } else {
            builder.append("NULL");
        }
        return builder.toString();

    }

    /**
     * Decodifica perguntas
     * @param minhasPerguntas
     * @return uma lista com todas as perguntas,id da maior pergunta e total de perguntas
     */
    public ArrayList<Object> decodificarPerguntas(String minhasPerguntas) {
        String[] string = decodificar(minhasPerguntas);
        ArrayList<Object> arrayList = new ArrayList<Object>();
        if (string[1].equals("NULL")) {
            return null;
        }
        if (string[1].equals("PERGUNTAS:")) {
            List<Pergunta> perguntas = new ArrayList<Pergunta>();
            String[] perguntasRecebidas = string[2].split("FINALPERGUNTA");
            for (int i = 0; i < perguntasRecebidas.length; i++) {
                Usuario u = new Usuario();
                String perguntadecodificada[] = perguntasRecebidas[i].split("@@");
                u.setNomeCompleto(perguntadecodificada[4]);
                Pergunta pergunta = new Pergunta();
                pergunta.setTitulo(perguntadecodificada[0]);
                pergunta.setMensagem(perguntadecodificada[1]);
                pergunta.setStatus(Integer.parseInt(perguntadecodificada[2]));
                pergunta.setId(Long.parseLong(perguntadecodificada[3]));
                pergunta.setUsuario(u);
                perguntas.add(pergunta);
            }
            arrayList.add(perguntas);
            /**
             * Mairo Id de Pergunta
             */
            arrayList.add(Integer.parseInt(string[3]));
            /**
             * Total de Pergunta
             */
            arrayList.add(Integer.parseInt(string[4]));
            return arrayList;
        }
        return null;
    }

    /**
     * metodo para obter respostas de uma determindada pergunta.
     * @param id
     * @param matricula
     * @return
     */
    public String getRespostas(Long id, String matricula) {
        return "GETRESPOSTASPERGUTA@," + id + "@," + matricula;
    }

    /**Codifica uma lista de respostas
     * @param respostas
     * @param totalRespostas
     * @return mensagem codificada com todas as respostas e com o respectivo total de respostas
     */
    public String codificaRespostas(Collection<Resposta> respostas, int totalRespostas) {
        Long idMaior = (long) 0;
        StringBuilder builder = new StringBuilder();
        builder.append("TODASRESPOSTAS@,");
        if (respostas != null && !respostas.isEmpty()) {
            builder.append("RESPOSTAS:");
            builder.append("@,");
            for (Resposta resposta : respostas) {

                //0
                builder.append(resposta.getMensagem());
                builder.append("@@");
                //1
                builder.append(resposta.getRespostaID());
                builder.append("@@");
                //2
                builder.append(resposta.getStatus());
                builder.append("@@");
                //3
                builder.append(resposta.getPontuacao());
                builder.append("@@");
                //4
                builder.append(resposta.getUsuario().getNomeCompleto());
                builder.append("@@");
                //5
                builder.append(resposta.getUsuario().getMatricula());
                builder.append("@@");
                builder.append("FIM");
                if (idMaior < resposta.getId()) {
                    idMaior = resposta.getId();
                }
            }
            builder.append("@,");
            builder.append(idMaior);
            builder.append("@,");
            builder.append(totalRespostas);
        } else {
            builder.append("NULL");
        }
        return builder.toString();
    }

    /**Decodifica as respostas que foram codificadas por codificarRespostas
     * @param todasRespostas
     * @return uma lista com todas as resposta
     */
    public ArrayList<Object> decodificaRespostas(String todasRespostas) {
        String[] string = decodificar(todasRespostas);
        ArrayList<Object> arrayList = new ArrayList<Object>();
        if (string[1].equals("NULL")) {
            return null;
        }
        if (string[1].equals("RESPOSTAS:")) {
            List<Resposta> respostas = new ArrayList<Resposta>();
            String[] respostasRecebidas = string[2].split("FIM");
            for (int i = 0; i < respostasRecebidas.length; i++) {
                Usuario usuario = new Usuario();
                String respostaDecodificada[] = respostasRecebidas[i].split("@@");
                usuario.setMatricula(respostaDecodificada[5]);
                usuario.setNomeCompleto(respostaDecodificada[4]);
                Resposta resposta = new Resposta();
                resposta.setId(Long.parseLong(respostaDecodificada[1]));
                resposta.setMensagem(respostaDecodificada[0]);
                resposta.setStatus(Integer.parseInt(respostaDecodificada[2]));
                resposta.setPontuacao(Double.parseDouble(respostaDecodificada[3]));
                resposta.setUsuario(usuario);
                respostas.add(resposta);
            }
            arrayList.add(respostas);
            /**
             * Mairo Id de Pergunta
             */
            arrayList.add(Integer.parseInt(string[3]));
            /**
             * Total de Pergunta
             */
            arrayList.add(Integer.parseInt(string[4]));
            return arrayList;
        }
        return null;
    }

    /**
     * Lista todas as perguntas
     * @param isadmin
     * @return
     */
    public String listarTodasPerguntas(boolean isadmin) {
        return "LISTARPERGUNTAS@," + isadmin;
    }
    /**
     * Utilizado para responder uma pergunta
     * @param resposta
     * @param matricula
     * @param idPergunta
     * @return
     */
    public String responderPergunta(String resposta, String matricula, String idPergunta) {
        return "RESPONDERPERGUNTA@," + resposta + "@," + matricula + "@," + idPergunta;
    }

    /**
     * PROTOCOLOS DEFINIDOS PARA ADMINISTRACAO
     * @author anderson soares
     */
    /**
     * Codificar uma LISTA de usuarios que vai ser enviada via socket
     * @param lista
     * @return
     */
    public String codificarUsuarios(Collection<Usuario> lista) {
        String retorno = "";

        String SEPARADOR_DADOS = "FYKAZ";
        String SEPARADOR_USUARIOS = "PWQFV";
        Iterator<Usuario> it = lista.iterator();
        while (it.hasNext()) {
            Usuario u = it.next();
            //Usuario tem ID, Nome, Email, Pontuacao, Status
            retorno += u.getId(); //0
            retorno += SEPARADOR_DADOS;
            retorno += u.getNomeCompleto(); //1
            retorno += SEPARADOR_DADOS;
            retorno += u.getEmail();//2
            retorno += SEPARADOR_DADOS;
            retorno += u.getPontosExtra();//3
            retorno += SEPARADOR_DADOS;
            retorno += u.getStatus();//4
            retorno += SEPARADOR_DADOS;
            retorno += u.getMatricula();//5

            retorno += SEPARADOR_USUARIOS;

        }
        System.out.println(retorno);
        return retorno;
    }

    /**
     * Decodificar uma LISTA de usuarios que foi enviada via socket
     * @param mensagemCodificada
     * @return
     */
    public ArrayList<Usuario> decodificarUsuarios(String mensagemCodificada) {
        if (mensagemCodificada.isEmpty() || mensagemCodificada == "" || mensagemCodificada == null) {
            return null;
        }
        String SEPARADOR_DADOS = "FYKAZ";
        String SEPARADOR_USUARIOS = "PWQFV";
        ArrayList<Usuario> usuarios = new ArrayList();
        String[] listaUsuario = mensagemCodificada.split(SEPARADOR_USUARIOS);
        for (int i = 0; i < listaUsuario.length; i++) {
            String[] dados = listaUsuario[i].split(SEPARADOR_DADOS);
            Usuario user = new Usuario();
            user.setId(Long.parseLong(dados[0]));
            user.setNomeCompleto(dados[1]);
            user.setEmail(dados[2]);
            user.setPontosExtra(Double.parseDouble(dados[3]));
            user.setStatus(Integer.parseInt(dados[4]));
            user.setMatricula(dados[5]);

            usuarios.add(user);
        }
        return usuarios;
    }

    /**
     * Codificar UM usuario para ser enviado via socket
     * @param Usuario
     * @return
     */
    public String codificarUsuario(Usuario u) {
        String retorno = "ATUALIZARUSUARIO@,";

        String SEPARADOR_DADOS = "FYKAZ";
        //Usuario tem ID, Nome, Email, Pontuacao, Status
        retorno += SEPARADOR_DADOS;
        retorno += u.getId(); //0
        retorno += SEPARADOR_DADOS;
        retorno += u.getNomeCompleto(); //1
        retorno += SEPARADOR_DADOS;
        retorno += u.getEmail();//2
        retorno += SEPARADOR_DADOS;
        retorno += u.getPontosExtra();//3
        retorno += SEPARADOR_DADOS;
        retorno += u.getStatus();//4
        retorno += SEPARADOR_DADOS;
        retorno += u.getMatricula();//5

        System.out.println(retorno);
        return retorno;
    }

    /**
     * Decodificar UM usuario que foi enviado via Socket
     * @param mensagemCodificada
     * @return
     */
    public Usuario decodificarUsuario(String mensagemCodificada) {
        String SEPARADOR_DADOS = "FYKAZ";
        String[] dados = mensagemCodificada.split(SEPARADOR_DADOS);
        Usuario user = new Usuario();
        user.setId(Long.parseLong(dados[1]));
        user.setNomeCompleto(dados[2]);
        user.setEmail(dados[3]);
        user.setPontosExtra(Double.parseDouble(dados[4]));
        user.setStatus(Integer.parseInt(dados[5]));
        user.setMatricula(dados[6]);


        return user;
    }
    /**
     * Codifica o pedido de listar perguntas solicitado pelo administrador
     * @param status
     * @return
     */
    public String codificarPedidoAdminListarPerguntas(int status) {
        return "ADMINLISTARPERGUNTAS@," + status;
    }
    /**
     * Decodifica lista de perguntas codificada pelo método codificarPedidoAdminListarPerguntas()
     * @param stringCodificada
     * @return
     */
    public ArrayList<Pergunta> adminDecodificarListarPerguntas(String stringCodificada) {
        ArrayList<Pergunta> arrayPerguntas = new ArrayList<Pergunta>();
        if (stringCodificada.isEmpty()) {
            return null;
        }

        String SeparadorAtributosPergunta = "FTXW";
        String SeparadorPerguntasDeSuasRespostas = "FGDR";
        String SeparadorAtributosResposta = "KJHL";
        String SeparadorRespostas = "RWQF";
        String SeparadorPerguntas = "NVCZ";

        String[] perguntas = stringCodificada.split(SeparadorPerguntas);
        for (int i = 0; i < perguntas.length; i++) {
            Pergunta p = new Pergunta();

            String[] aux = perguntas[i].split(SeparadorPerguntasDeSuasRespostas);
            String pergunta = aux[0];
            String[] dadosPergunta = pergunta.split(SeparadorAtributosPergunta);
            Long perguntaId = Long.parseLong(dadosPergunta[0]);
            String tituloPergunta = dadosPergunta[1];
            String perguntaMensagem = dadosPergunta[2];
            int statusPergunta = Integer.parseInt(dadosPergunta[3]);

            Long usuarioPerguntaId = Long.parseLong(dadosPergunta[4]);
            String usuarioPerguntaNome = dadosPergunta[5];
            Usuario userPergunta = new Usuario();
            userPergunta.setId(usuarioPerguntaId);
            userPergunta.setNomeCompleto(usuarioPerguntaNome);
            String comentario = dadosPergunta[6];


            p.setPerguntaID(perguntaId);
            p.setTitulo(tituloPergunta);
            p.setMensagem(perguntaMensagem);
            p.setStatus(statusPergunta);
            p.setUsuario(userPergunta);
            p.setComentario(comentario);



            ArrayList<Resposta> listaRespostas = new ArrayList<Resposta>();
            String respostas = "";
            if (aux.length != 1) {
                respostas = aux[1];
                String[] resposta = respostas.split(SeparadorRespostas);
                for (int j = 0; j < resposta.length; j++) {
                    Resposta r = new Resposta();
                    String[] dadosResposta = resposta[j].split(SeparadorAtributosResposta);

                    Long respostaId = Long.parseLong(dadosResposta[0]);
                    String mensagemResposta = dadosResposta[1];
                    Double pontuacao = Double.parseDouble(dadosResposta[2]);
                    int statusResposta = Integer.parseInt(dadosResposta[3]);

                    Usuario userResposta = new Usuario();

                    Long usuarioRespostaId = Long.parseLong(dadosResposta[4]);
                    String usuarioResposta = dadosResposta[5];
                    userResposta.setId(usuarioRespostaId);
                    userResposta.setNomeCompleto(usuarioResposta);

                    r.setId(respostaId);
                    r.setMensagem(mensagemResposta);
                    r.setPontuacao(pontuacao);
                    r.setStatus(statusResposta);
                    r.setUsuario(userResposta);
                    r.setPergunta(p);

                    listaRespostas.add(r);
                }
                p.setRespostas(listaRespostas);
            }
            arrayPerguntas.add(p);
        }
        return arrayPerguntas;
    }
    /**
     * Codifica lista de perguntas
     * @param perguntas
     * @return
     */
    public String adminCodificarListarPerguntas(List<Pergunta> perguntas) {
        String SeparadorAtributosPergunta = "FTXW";
        String SeparadorPerguntasDeSuasRespostas = "FGDR";
        String SeparadorAtributosResposta = "KJHL";
        String SeparadorRespostas = "RWQF";
        String SeparadorPerguntas = "NVCZ";

        String dados = "";

        Iterator it = perguntas.iterator();
        while (it.hasNext()) {
            Pergunta p = (Pergunta) it.next();

            dados += p.getPerguntaID() + //0
                    SeparadorAtributosPergunta
                    + p.getTitulo() +//1
                    SeparadorAtributosPergunta +//Separando atributos da pergunta
                    p.getMensagem() +//2
                    SeparadorAtributosPergunta
                    + p.getStatus() +//3
                    SeparadorAtributosPergunta
                    + p.getUsuario().getId() +//4
                    SeparadorAtributosPergunta
                    + p.getUsuario().getNomeCompleto() +//5
                    SeparadorAtributosPergunta
                    + p.getComentario() +//6
                    SeparadorPerguntasDeSuasRespostas;//Separando a pergunta das respostas


            List respostas = p.getRespostas();
            if (respostas != null) {
                Iterator itResp = respostas.iterator();
                while (itResp.hasNext()) {
                    Resposta r = (Resposta) itResp.next();
                    dados += r.getRespostaID() +//0
                            SeparadorAtributosResposta
                            + r.getMensagem() +//1
                            SeparadorAtributosResposta +//Separando atributos das respostas
                            r.getPontuacao() +//2
                            SeparadorAtributosResposta
                            + r.getStatus() +//3
                            SeparadorAtributosResposta
                            + r.getUsuario().getId() +//4
                            SeparadorAtributosResposta
                            + r.getUsuario().getNomeCompleto();//5

                    dados += SeparadorRespostas;
                }
            }
            dados += SeparadorPerguntas;//Separando a pergunta das outras perguntas
        }

        return dados;
    }
    /**
     * Codifica atualização do status da pergunta
     * @param id
     * @param status
     * @return
     */
    public String adminCodificarAtualizarStatusPergunta(int id, int status) {
        return "ATUALIZARSTATUSPERGUNTA@," + id + "@," + status;
    }

    /**
     * Codifica comentario da pergunta
     * @param id
     * @param comentario
     * @return
     */
    public String adminCodificarComentarPergunta(Long id, String comentario) {
        return "COMENTARPERGUNTA@," + id + "@," + comentario;
    }

    /**
     * Retorna a pontuação do aluno correspondente a matricula
     * @param matricula
     * @param ano
     * @param mes
     * @param dia
     * @param anoFinal
     * @param mesFinal
     * @param diaFinal
     * @return
     */
    public String getPontuacao(String matricula, int ano, int mes, int dia, int anoFinal, int mesFinal, int diaFinal) {
        return "GETPONTUACAO" + "@,"
                + matricula + "@,"
                + ano + "@,"
                + mes + "@,"
                + dia + "@,"
                + anoFinal + "@,"
                + mesFinal + "@,"
                + diaFinal;
    }

    /**
     * Retorna a pontuação do aluno correspondente a matricula
     * @param matricula
     * @return
     */
    public String getPontuacao(String matricula) {
        return "GETPONTUACAO" + "@,"
                + matricula;
    }

    /**
     * Retorna perguntas por status
     * @param matricula
     * @param status
     * @return
     */
    public String getMinhasPerguntasByStatus(String matricula, int status) {
        return "GETPERGUNTASBYSTATUS" + "@,"
                + matricula + "@," + status;
    }

    /**
     * Codifica pedido de respostas
     * @param perguntaId
     * @param selecionado
     * @return
     */
    public String adminCodificarPedidoRespostas(Long perguntaId, int selecionado) {
        return "ADMINLISTARRESPOSTAS@," + perguntaId + "@," + selecionado;
    }

    /**Codifica uma lista de respostas
     * @param respostas
     * @param totalRespostas
     * @return mensagem codificada com todas as respostas e com o respectivo total de respostas
     */
    public String codificaRespostasByStatus(Collection<Resposta> respostas, int totalRespostas) {
        Long idMaior = (long) 0;
        StringBuilder builder = new StringBuilder();
        builder.append("TODASRESPOSTASBYSTATUS@,");
        if (respostas != null && !respostas.isEmpty()) {
            builder.append("RESPOSTAS:");
            builder.append("@,");
            for (Resposta resposta : respostas) {

                //0
                builder.append(resposta.getMensagem());
                builder.append("@@");
                //1
                builder.append(resposta.getRespostaID());
                builder.append("@@");
                //2
                builder.append(resposta.getStatus());
                builder.append("@@");
                //3
                builder.append(resposta.getPontuacao());
                builder.append("@@");
                //4
                builder.append(resposta.getComentario());
                builder.append("@@");
                builder.append("FIM");
                if (idMaior < resposta.getId()) {
                    idMaior = resposta.getId();
                }
            }
            builder.append("@,");
            builder.append(idMaior);
            builder.append("@,");
            builder.append(totalRespostas);
        } else {
            builder.append("NULL");
        }
        return builder.toString();
    }

    /**Decodifica as respostas que foram codificadas por codificarRespostasBystatus
     * @param todasRespostas
     * @return
     */
    public ArrayList<Object> decodificaRespostasByStatus(String todasRespostas) {
        String[] string = decodificar(todasRespostas);
        ArrayList<Object> arrayList = new ArrayList<Object>();
        if (string[1].equals("NULL")) {
            return null;
        }
        if (string[1].equals("RESPOSTAS:")) {
            List<Resposta> respostas = new ArrayList<Resposta>();
            String[] respostasRecebidas = string[2].split("FIM");
            for (int i = 0; i < respostasRecebidas.length; i++) {
                String respostaDecodificada[] = respostasRecebidas[i].split("@@");

                Resposta resposta = new Resposta();
                resposta.setMensagem(respostaDecodificada[0]);
                resposta.setId(Long.parseLong(respostaDecodificada[1]));
                resposta.setStatus(Integer.parseInt(respostaDecodificada[2]));
                resposta.setPontuacao(Double.parseDouble(respostaDecodificada[3]));
                resposta.setComentario(respostaDecodificada[4]);
                respostas.add(resposta);
            }
            arrayList.add(respostas);
            /**
             * Mairo Id de Pergunta
             */
            arrayList.add(Integer.parseInt(string[3]));
            /**
             * Total de Pergunta
             */
            arrayList.add(Integer.parseInt(string[4]));
            return arrayList;
        }
        return null;
    }

    /**
     * Codifica perguntas por status
     * @param perguntas
     * @param totalPerguntas
     * @return
     */
    public String codificarPerguntasByStatus(Collection<Pergunta> perguntas, int totalPerguntas) {
        StringBuilder builder = new StringBuilder();
        Long idMaior = (long) 0;
        builder.append("MINHASPERGUNTASBYSTATUS@,");
        if (perguntas != null && !perguntas.isEmpty()) {
            builder.append("PERGUNTAS:");
            builder.append("@,");
            for (Pergunta pergunta2 : perguntas) {
                builder.append(pergunta2.getTitulo());
                builder.append("@@");
                builder.append(pergunta2.getMensagem());
                builder.append("@@");
                builder.append(pergunta2.getStatus());
                builder.append("@@");
                builder.append(pergunta2.getId());
                builder.append("@@");
                builder.append(pergunta2.getComentario());
                builder.append("@@");
                builder.append("FINALPERGUNTA");
                if (idMaior < pergunta2.getId()) {
                    idMaior = pergunta2.getId();
                }

            }
            builder.append("@,");
            builder.append(idMaior);
            builder.append("@,");
            builder.append(totalPerguntas);
        } else {
            builder.append("NULL");
        }
        return builder.toString();

    }

    /**
     * Decodifica perguntas por status
     * @param minhasPerguntas
     * @return uma lista com todas as perguntas,id da maior perguntae total de perguntas
     */
    public ArrayList<Object> decodificarPerguntasByStatus(String minhasPerguntas) {
        String[] string = decodificar(minhasPerguntas);
        ArrayList<Object> arrayList = new ArrayList<Object>();
        if (string[1].equals("NULL")) {
            return null;
        }
        if (string[1].equals("PERGUNTAS:")) {
            List<Pergunta> perguntas = new ArrayList<Pergunta>();
            String[] perguntasRecebidas = string[2].split("FINALPERGUNTA");
            for (int i = 0; i < perguntasRecebidas.length; i++) {
                String perguntadecodificada[] = perguntasRecebidas[i].split("@@");
                Pergunta pergunta = new Pergunta();
                pergunta.setTitulo(perguntadecodificada[0]);
                pergunta.setMensagem(perguntadecodificada[1]);
                pergunta.setStatus(Integer.parseInt(perguntadecodificada[2]));
                pergunta.setId(Long.parseLong(perguntadecodificada[3]));
                pergunta.setComentario(perguntadecodificada[4]);
                perguntas.add(pergunta);
            }
            arrayList.add(perguntas);
            /**
             * Mairo Id de Pergunta
             */
            arrayList.add(Integer.parseInt(string[3]));
            /**
             * Total de Pergunta
             */
            arrayList.add(Integer.parseInt(string[4]));
            return arrayList;
        }
        return null;
    }

    /**
     * Codifica respostas
     * @param respostas
     * @return
     */
    public String adminCodificarRespostas(List<Resposta> respostas) {
        String SeparadorRespostas = "GASDGZ";
        String SeparadorDados = "FFSXZ";
        String dados = "";

        if (!respostas.isEmpty() || respostas != null) {
            Iterator<Resposta> it = respostas.iterator();
            while (it.hasNext()) {
                Resposta r = it.next();
                dados += r.getId() +//0
                        SeparadorDados
                        + r.getMensagem() +//1
                        SeparadorDados
                        + r.getComentario() +//2
                        SeparadorDados
                        + r.getStatus() +//3
                        SeparadorDados
                        + r.getPontuacao() +//4
                        SeparadorDados
                        + r.getUsuario().getId() +//5
                        SeparadorDados
                        + r.getUsuario().getNomeCompleto() +//6
                        SeparadorDados
                        + r.getPergunta().getPerguntaID();//7
                //SeparadorDados+
                //r.getDataEnvio()+//8

                dados += SeparadorRespostas;
            }
        }
        return dados;
    }

    /**
     * Decodifica respostas
     * @param stringCodificada
     * @return
     */
    public ArrayList<Resposta> adminDecodificarRespostas(String stringCodificada) {
        ArrayList<Resposta> arrayRespostas = new ArrayList<Resposta>();
        if (stringCodificada.isEmpty()) {
            return null;
        }

        String SeparadorRespostas = "GASDGZ";
        String SeparadorDados = "FFSXZ";

        String[] respostas = stringCodificada.split(SeparadorRespostas);
        for (int i = 0; i < respostas.length; i++) {
            Resposta r = new Resposta();
            String[] dados = respostas[i].split(SeparadorDados);
            r.setId(Long.parseLong(dados[0]));
            r.setMensagem(dados[1]);
            r.setComentario(dados[2]);
            r.setStatus(Integer.parseInt(dados[3]));
            r.setPontuacao(Double.parseDouble(dados[4]));
            Usuario usuario = new Usuario();
            usuario.setId(Long.parseLong(dados[5]));
            usuario.setNomeCompleto(dados[6]);
            r.setUsuario(usuario);
            Pergunta p = new Pergunta();
            p.setId(Long.parseLong(dados[7]));
            r.setPergunta(p);
            //r.setDataEnvio(dados[5]);
            arrayRespostas.add(r);
        }



        return arrayRespostas;
    }

    /**
     * Codifica comentario da resposta
     * @param id
     * @param comentario
     * @return
     */
    public String adminCodificarComentarResposta(Long id, String comentario) {
        return "COMENTARRESPOSTA@," + id + "@," + comentario;
    }

    /**
     * Metodo usado para retorna respostas do usuario por status
     * @param matricula
     * @param selectedIndex
     * @return
     */
    public String getMinhasRespostasByStatus(String matricula, int selectedIndex) {
        return "GETRESPOSTASBYSTATUS@," + matricula + "@," + selectedIndex;
    }

    /**
     * Protocolo pra solicitar as notas de varios usuarios
     * @return
     */
    public String getUsuariosNota() {
        return "GETUSUARIOSNOTA";
    }

    /**
     * Protocolo pra solicitar as notas de varios usuarios por data
     * @param dia
     * @param mes
     * @param ano
     * @param diaFinal
     * @param mesFinal
     * @param anoFinal
     * @return
     */
    public String getUsuariosNota(int dia, int mes, int ano, int diaFinal, int mesFinal, int anoFinal) {
        return "GETUSUARIOSNOTA@," + dia + "@," + mes + "@," + ano + "@," + diaFinal + "@," + mesFinal + "@," + anoFinal;
    }

    /**
     * Metodo que retorna nota da resposta
     * @return
     */
    public String getRespostasNota() {
        return "GETRESPOSTASNOTA";
    }

    /**
     * Metodo que retorna nota  da resposta e informações adicionais como data
     * @param dia
     * @param mes
     * @param ano
     * @param diaFinal
     * @param mesFinal
     * @param anoFinal
     * @return
     */
    public String getRespostasNota(int dia, int mes, int ano, int diaFinal, int mesFinal, int anoFinal) {
        return "GETRESPOSTASNOTA@," + dia + "@," + mes + "@," + ano + "@," + diaFinal + "@," + mesFinal + "@," + anoFinal;
    }
    /**
     * Codifica respostas
     * @param respostas
     * @return
     */
    public String codificaRespostas(Collection<Resposta> respostas) {
        StringBuilder builder = new StringBuilder();
        builder.append("TODASRESPOSTAS@,");
        if (respostas != null && !respostas.isEmpty()) {
            builder.append("RESPOSTAS:");
            builder.append("@,");
            for (Resposta resposta : respostas) {

                //0
                builder.append(resposta.getMensagem());
                builder.append("@@");
                //1
                builder.append(resposta.getPontuacao());
                builder.append("@@");
                //2
                builder.append(resposta.getUsuario().getNomeCompleto());
                builder.append("@@");
                builder.append("FIM");

            }

        } else {
            builder.append("NULL");
        }
        return builder.toString();
    }

    /**Decodifica as respostas que foram codificadas por codificarRespostas
     * @param todasRespostas
     * @return
     */
    public List<Resposta> decodificarRespostas(String todasRespostas) {
        String[] string = decodificar(todasRespostas);
        if (string[1].equals("NULL")) {
            return null;
        }
        if (string[1].equals("RESPOSTAS:")) {
            List<Resposta> respostas = new ArrayList<Resposta>();
            String[] respostasRecebidas = string[2].split("FIM");
            for (int i = 0; i < respostasRecebidas.length; i++) {
                Usuario usuario = new Usuario();
                String respostaDecodificada[] = respostasRecebidas[i].split("@@");
                usuario.setNomeCompleto(respostaDecodificada[2]);
                Resposta resposta = new Resposta();
                resposta.setMensagem(respostaDecodificada[0]);
                resposta.setPontuacao(Double.parseDouble(respostaDecodificada[1]));
                resposta.setUsuario(usuario);
                respostas.add(resposta);
            }


            return respostas;
        }
        return null;
    }

    /**
     * Atualiza resposta
     * @param respostaId
     * @param opcaoSelecionada
     * @param nota
     * @return
     */
    public String adminAtualizarResposta(Long respostaId, int opcaoSelecionada, double nota) {
        return "ADMINATUALIZARRESPOSTA@," + respostaId + "@," + opcaoSelecionada + "@," + nota;
    }
    /**
     * alterar usuario 
     * @param matricula
     * @param senha
     * @param email
     * @param nome
     * @return
     */
   public String alterarUsuario(String matricula, String senha,
            String email, String nome) {
        return "ALTERARUSUARIO@," + matricula + "@," + nome + "@," + senha + "@," + email;
    }

}
